﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PetSoft.GUI;
using Business_Entity;
using Business_Logic;
using PetSoft.GUI.Compras;
using PetSoft.GUI.GestRecursos;

namespace PetSoft.GestionRecursos
{
    public partial class MProductos : Form
    {
    	int constructor;
        List<BEProducto> listaFinal;     
        
		public List<BEProducto> ListaFinal {
			get { return listaFinal; }
			set { listaFinal = value; }
		}
    	private int codigoProducto;
    	private int codigoProveedor;
    	List<BEProveedor> listaProveedor;
        
        
        public MProductos(int constructor)
        {
        	//Toma valor de 1 para mantenimiento de productos y 2 para busqueda de productos        	
            InitializeComponent();
            /* codigo de privilegios */
            
            this.btnNuevProd.Enabled = false;
            for (int i=0;i<BLInfo.usuarioActual.Rol.Privilegio.Count;i++){
                if ((new BLPrivilegio()).existePrivilegio(2,"GREC","PROD",BLInfo.UsuarioActual.Rol.Privilegio)){
                    this.btnNuevProd.Enabled = true;
                }
            }
            
            
             /*end*/
            this.constructor = constructor;
            this.Load += new EventHandler(MProductos_Load);
            this.txtCod.KeyPress += new KeyPressEventHandler(soloNum);
            this.txtNomProd.KeyPress += new KeyPressEventHandler(soloLetras);   
            if(this.constructor==2){//Busqueda de producto
            	this.btnNuevProd.Enabled = false;
            	this.btnEditProd.Enabled = false;
            	this.btnEliProd.Enabled = false;
            	this.MaximumSize = new System.Drawing.Size(800,450);
            	this.MinimumSize = new System.Drawing.Size(800,450);
            	this.btnListProv.Hide();
            	this.prodVBTN.Hide();
            	this.btnNuevProd.Hide();
            	this.btnEditProd.Enabled = true;
            	this.btnEliProd.Enabled = true;
            	this.btnEliProd.Text = "Cancelar";
            	this.btnEditProd.Text = "Aceptar";
            	this.StartPosition = FormStartPosition.CenterScreen;
            }
            this.agrProvBTN.Enabled = false;
            this.eliProvBTN.Enabled = false;
            this.prodTBL.DoubleClick += new EventHandler(doble_click);
            this.tblProv.DoubleClick += new EventHandler(doble_clickProv);
        }
        
        private void doble_click(object sender, EventArgs e){
			int aux = this.prodTBL.CurrentRow.Index;
			if(((bool)this.prodTBL[0, aux].Value) == true){
				this.prodTBL[0, aux].Value = false;
			}
			else{
				this.prodTBL[0, aux].Value = true;
			}
		}
        
        private void doble_clickProv(object sender, EventArgs e){
			int aux = this.tblProv.CurrentRow.Index;
			if(((bool)this.tblProv[0, aux].Value) == true){
				this.tblProv[0, aux].Value = false;
			}
			else{
				this.tblProv[0, aux].Value = true;
			}
		}
        
        public List<BEProducto> getProductosSeleccionados(){
        	return this.listaFinal;
        }
        
        private void soloLetras(object sender, KeyPressEventArgs e){
        	Utils.SoloLetrasTB(sender, e);
        }
        
        private void soloNum(object sender, KeyPressEventArgs e){
        	Utils.SoloNumerosTB(sender, e);
        }
               
        private void MProductos_Load(object sender, EventArgs e){
        	
        	//Carga de los datos en el combobox
        	BLTipoProducto tipo = new BLTipoProducto();
        	this.cbTipoProd.DataSource = tipo.getAllTipoProd();
        	this.cbTipoProd.ValueMember = "codigo";
        	this.cbTipoProd.DisplayMember = "descripcion";
        	
        	//Carga de los datos en la tabla de productos
        }
        
        public void cargaTablaProductos(){
        	BLProducto prod;
			List<BEProducto> lista;        	
        	prod = new BLProducto();
        	lista = prod.getProductos();
        	this.prodTBL.Rows.Clear();
        	foreach (BEProducto p in lista) {
        		//String[] fila = {"" + p.Codigo, "" + p.Nombre, "" + p.Descripcion, 
        		//	"" + p.TipoProducto.Descripcion};
        		this.prodTBL.Rows.Add(false, "" + p.Codigo, "" + p.Nombre, "" + p.Descripcion, 
        			"" + p.TipoProducto.Descripcion, "" + p.Marca, "" + p.PrecioVenta);
        	}        	
        	if(lista.Count()!=0){
	        	if(this.constructor==1){
        			 /* codigo de privilegios */
                               
	                this.btnEditProd.Enabled = false;
	                this.btnEliProd.Enabled = false;            
	                
	                for (int i=0;i<BLInfo.usuarioActual.Rol.Privilegio.Count;i++){
	                    if ((new BLPrivilegio()).existePrivilegio(2,"GREC","PROD",BLInfo.UsuarioActual.Rol.Privilegio)){
	                        this.btnEditProd.Enabled = true;
	                        this.btnEliProd.Enabled = true; 
	                    }                
	                }
	                
	                /*end*/  
					this.prodVBTN.Enabled = true;		        	
	        	}
	        	this.btnListProv.Enabled = true;
	        	this.prodValCantLBL.Text = "" + lista.Count();
        	}
        	
        }

        private void resBusquedaProd(List<BEProducto> list) {
        	this.prodTBL.Rows.Clear(); 
            foreach (BEProducto p in list)
            {          	
                this.prodTBL.Rows.Add(false, "" + p.Codigo, "" + p.Nombre, "" + p.Descripcion, 
        			"" + p.TipoProducto.Descripcion, "" + p.Marca, "" + p.PrecioVenta);
        		//MessageBox.Show("" + p.Codigo + " num:" + list.Count());
            }             
        	this.prodValCantLBL.Text = "" + list.Count();
        	if(list.Count()!=0){
        		if(this.constructor==1){
	            	this.btnEditProd.Enabled = true;
	        		this.btnEliProd.Enabled = true;
	        		this.prodVBTN.Enabled = true;
	            }        	
	            else{
	            	this.btnEditProd.Enabled = false;
	        		this.btnEliProd.Enabled = false;            
	            }
	        	this.btnListProv.Enabled = true;
        	}
           
        }

        private void btnBuscarProd_Click(object sender, EventArgs e)
        {
        	//Primero validamos cuales son los campos que serán usados para la búsqueda
        	//Todos los campos que no sean usados tendrán el valor 0 si son numero y vacio si son strings
        	int cod;
        	String nom, tipo, marca;
        	int val = (int) this.cbTipoProd.SelectedValue;
        	//MessageBox.Show("" + val);
        	//Limpia la tabla de productos
        	this.prodTBL.Rows.Clear();
        	if((this.txtCod.Text=="") && (this.txtNomProd.Text=="") && (val==-1)&&(this.prodMarTXT.Text=="")){
        		//Se carga toda la lista de productos
        		cargaTablaProductos();
        	}
        	else{
	        	if(this.txtCod.Text!=""){
	        		try{//si lo puede convertir entonces el codigo ingresado es correcto
	        			cod = Int32.Parse(this.txtCod.Text);
	        			//MessageBox.Show("" + cod);
	        		}
	        		catch{//si no lo puede convertir entonces es incorrecto
	        			Utils.MessageAviso("Debe ingresar un código correcto.",null);
	        			this.txtCod.Focus();
	        			return;
	        		}        		
	        	}
        		else{
        			cod=0;
	        		//MessageBox.Show("" + cod);
        		}
	        	//MessageBox.Show("" + cod);
	        	//validaSQLInjection(this.txtNomProd.Text);
	        	nom = this.txtNomProd.Text;
	        	marca = this.prodMarTXT.Text;
	        	if(((int)this.cbTipoProd.SelectedValue) == -1){
	        		tipo="";
	        	}
	        	else
	        		tipo = this.cbTipoProd.Text;
	        	//validaSQLInjection(this.txtProv.Text);
	        	/*if(this.txtProv.Text!="")
	        		codProv = Int32.Parse(this.txtProv.Text);
	        	else
	        		codProv = 0;*/

                BLProducto prod;
                prod = new BLProducto();
                resBusquedaProd(prod.buscarProducto(cod, nom, tipo, marca));
        	}
        }

        private void btnCanc_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
        	GUIBuscarProveedor ventBusProv = new GUIBuscarProveedor();
        	ventBusProv.ShowDialog();            
        }

        private void btnNuevProd_Click(object sender, EventArgs e)
        {
            GUINuevoProd ventNuevoProd = new GUINuevoProd();  
            ventNuevoProd.ShowDialog();          
            if (ventNuevoProd.regCorrecto==1) {
                cargaTablaProductos();            
            }
        }
        
        
        /*
        void BtnAceptarClick(object sender, EventArgs e)
        {
        	producto = new BEProducto(0, "Shampoo", "x", "x", new BETipoProducto(0));
        	this.Close();
        }*/
        
        private void BtnLimpiarClick(object sender, EventArgs e)
        {
        	this.txtCod.Clear();
        	this.txtNomProd.Clear();
        	this.txtNomProd.Clear();
        	this.prodMarTXT.Clear();
        	this.cbTipoProd.SelectedIndex = 0;
        	this.prodTBL.Rows.Clear();
        	this.tblProv.Rows.Clear();
        	if(this.constructor==1){
	        	this.btnEditProd.Enabled = false;
	        	this.btnEliProd.Enabled = false;
	        	this.btnListProv.Enabled = false;
	        	this.prodVBTN.Enabled = false;
        	}
        	this.prodValCantLBL.Text = "0";
        	this.provCantValLBL.Text = "0";
        }
               
        void BtnEditProdClick(object sender, EventArgs e)
        {
        	int cont = 0, index=0, contAux = 0;
        	//try{
        	if(this.constructor==2){
        		int codProd;
        		BLProducto blProd = new BLProducto();
        		List<BEProducto> lista = new List<BEProducto>();
        		this.listaFinal = new List<BEProducto>();
        		for(int i=0; i<this.prodTBL.RowCount;i++){
	            	if((this.prodTBL[0,i].Value!=null) && (Convert.ToBoolean(this.prodTBL[0,i].Value) == true)){
	            		codProd = Int32.Parse(this.prodTBL[1,i].Value.ToString());
	            		lista = blProd.getProductoByCod(codProd);
	            		this.listaFinal.Add(lista[0]);
	            	}            	
	            }
        		this.Close();
        	}
        	else{
	        	foreach(DataGridViewRow fila in this.prodTBL.Rows){
	        		if(fila.Cells[0].Value != null && (bool)fila.Cells[0].Value){
	        			index = contAux;
	        			cont++;
	        		}      		
	        		contAux++;
	        	} 
		        if(cont==0){
		        	Utils.MessageAviso("Debe seleccionar algún producto para editar.",null);
		        }
		        if(cont>1){
		        	Utils.MessageAviso("Debe seleccionar solo 1 producto para editar.",null);
		        }
		        if(cont==1){
		        	BLProducto bProd = new BLProducto();
				    List<BEProducto> prod = new List<BEProducto>();
				    int aux = Int32.Parse(this.prodTBL[1, index].Value.ToString());
				    prod = bProd.getProductoByCod(aux);
				    // MessageBox.Show("" + prod.Codigo);
				    try{
					    GUIModificarProducto modificarProd = new GUIModificarProducto(prod[0],1);
					    modificarProd.ShowDialog();
					    if (modificarProd.modProd==1) {
			            	cargaTablaProductos();            
					    }
				    }
				    catch{
				    	Utils.MessageInformation("El producto fue eliminado anteriormente.");
				    	cargaTablaProductos();
				    }
		        }
        	}
        }
        
        private void cargaTablaProveedores(int codProd){
        	List<BEProveedor> lista;
        	lista = new List<BEProveedor>();
        	BLProductoProveedor prodProv = new BLProductoProveedor();
        	lista = prodProv.getProveedoresByProductoFiorella(codProd);
        	this.tblProv.Rows.Clear();
        	if(lista.Count==0){
        		this.listaProveedor = new List<BEProveedor>();
        	}
        	else{
        		this.listaProveedor = new List<BEProveedor>();
	        	foreach (BEProveedor p in lista) {
	        		//String[] fila = {"" + p.IdProv, "" + p.RazonSocial};
	        		this.tblProv.Rows.Add(false, "" + p.IdProv, "" + p.RazonSocial);
	        		this.listaProveedor.Add(p);
	        	}
        	}
        	this.provCantValLBL.Text = "" + lista.Count();
        }
        

        private void btnEliProd_Click(object sender, EventArgs e)
        {
        	int cont, contAux;
            cont = 0;
            contAux = 0;
            if(this.constructor==1){//mantenimiento de productos
	            String msgError = "No se pudo eliminar los siguientes producto pues están siendo" + Environment.NewLine +
	  								"en un pedido de abastecimiento:" + Environment.NewLine;
	            for(int i=0; i<this.prodTBL.RowCount;i++){
	            	if((this.prodTBL[0,i].Value!=null) && (Convert.ToBoolean(this.prodTBL[0,i].Value) == true)){
	            		cont++;
	            	}            	
	            }            
	            if(cont==0){
	            	Utils.MessageAviso("Debe seleccionar algún producto para eliminar.",null);
	            }
	            else{
	            	DialogResult res;
	            	if(cont==1){
	            		res = MessageBox.Show("Está seguro que desea eliminar el producto seleccionado?", "Ventana de Confirmacion", MessageBoxButtons.YesNo);
	            	}
	            	else{
	            		res = MessageBox.Show("Está seguro que desea eliminar los " + cont + " productos seleccionados?", "Ventana de Confirmacion", MessageBoxButtons.YesNo);
	            	}
	            	if (res == DialogResult.Yes){
	            		for(int i=0; i<this.prodTBL.RowCount;i++){
	            			if((this.prodTBL[0,i].Value!=null) && (Convert.ToBoolean(this.prodTBL[0,i].Value) == true)){
	            				int codProd = Int32.Parse(this.prodTBL[1,i].Value.ToString());
	            				BLProducto prod = new BLProducto();
	            				int aux = prod.eliminaProducto(codProd);
	            				//MessageBox.Show("" + codProd);
	            				if (aux == 1){//elimando correctamente
	            					contAux++;
	                			}
	            				if(aux == 2){//no se puede eliminar porque esta en un pedido de abastecimiento
	            					msgError = msgError + "                -" + this.prodTBL[2,i].Value.ToString() + Environment.NewLine;
	            				}
	            			}            	
	            		}
	            		if(cont == contAux){
	            			if(cont==1){
	                    		Utils.MessageInformation("El producto fue eliminado correctamente."); 
	            			}
	            			else{
	                    		Utils.MessageInformation("Los " + cont + " productos seleccionados fueron eliminados correctamente."); 
	            			}
	                    	cargaTablaProductos();           		
	            		}
	            		else{
	                    	MessageBox.Show(msgError);            		
	            		}
	            	}
	            	else {
	            	}
	            }
            }
            else{//buscar productos
            	this.Close();
            }
        }
        
        
        void ProdTBLCellContentClick(object sender, DataGridViewCellEventArgs e)
        {   
        	if(((bool)this.prodTBL[0, this.prodTBL.CurrentRow.Index].Value) == true){
        		this.prodTBL[0, this.prodTBL.CurrentRow.Index].Value = false;
        	}
        	else{
        		this.prodTBL[0, this.prodTBL.CurrentRow.Index].Value = true;
        	}
        }
        
        void BtnListProvClick(object sender, EventArgs e)
        {
        	int cont = 0, contAux = 0, index = 0;
            try{
        		for(int i=0; i<this.prodTBL.RowCount;i++){
	            	if((this.prodTBL[0,i].Value!=null) && (Convert.ToBoolean(this.prodTBL[0,i].Value) == true)){
	            		cont++;
	            		index = contAux;
	            	}            	
        			contAux++;
	            }
        		if(cont==0){
        			Utils.MessageAviso("Debe seleccionar algún producto para listar sus proveedores.",null);        			
        		}
        		if(cont>1){
        			Utils.MessageAviso("Debe seleccionar solo 1 producto para listar sus proveedores.",null);        			
        		}
        		if(cont==1){
        			this.codigoProducto = Int32.Parse(this.prodTBL[1,index].Value.ToString());
	        		cargaTablaProveedores(this.codigoProducto);
	        		if(this.constructor==1){
	        			this.eliProvBTN.Enabled = false;
                        this.agrProvBTN.Enabled = false;
                        
                
                        for (int i=0;i<BLInfo.usuarioActual.Rol.Privilegio.Count;i++){
                            if ((new BLPrivilegio()).existePrivilegio(2,"GREC","PROD",BLInfo.UsuarioActual.Rol.Privilegio)){
                                this.eliProvBTN.Enabled = true;
                                this.agrProvBTN.Enabled = true;
                        
                            }                
                        }
	        		}
        		}
        	}
        	catch{
        		Utils.MessageAviso("Debe seleccionar algún producto para poder mostrar su lista de proveedores.",null);
        	}
        }
        
        
        void EliHeaderCBCheckedChanged(object sender, EventArgs e)
        {
        	for(int i=0; i<this.prodTBL.RowCount; i++){
        		this.prodTBL[0, i].Value = this.eliHeaderCB.Checked;
				//list[0, i].Value = ((CheckBox) list.Controls.Find("checkboxHeader", true)[0]).Checked;    		
        	}
        }
        
        
        void EliProvBTNClick(object sender, EventArgs e)
        {
        	int cont = 0;
        	for(int i=0; i<this.tblProv.RowCount;i++){
	            if((this.tblProv[0,i].Value!=null) && (Convert.ToBoolean(this.tblProv[0,i].Value) == true)){
	            	cont++;
	            }            	
	        }
        	if(cont==0){
        		Utils.MessageAviso("Debe seleccionar algún proveedor para desasociar al producto.",null);
        	}
        	else{
        		DialogResult res;
        		if(cont==1){
        			res = MessageBox.Show("Está seguro que desea desasociar el proveedor a este producto?", "Ventana de Confirmación", MessageBoxButtons.YesNo);
        		}
        		else{
        			res = MessageBox.Show("Está seguro que desea desasociar los proveedores a este producto?", "Ventana de Confirmación", MessageBoxButtons.YesNo);
        		}
        		if(res == DialogResult.Yes){
        			BLProducto blProd = new BLProducto();
        			for(int i=0; i<this.tblProv.RowCount;i++){
			            if((this.tblProv[0,i].Value!=null) && (Convert.ToBoolean(this.tblProv[0,i].Value) == true)){
        					this.codigoProveedor = Int32.Parse(this.tblProv[1,i].Value.ToString());
        					int resultado = blProd.eliminaProvDeProd(this.codigoProveedor, this.codigoProducto);
        					if(resultado==0){
        						Utils.MessageError("No se puede desasociar el proveedor al producto" + Environment.NewLine + "ya que hay un pedido de abastecimiento del producto con este proveedor.",null);
        						break;
        					}
			            }            	
			        }
        			cargaTablaProveedores(this.codigoProducto);
        		}
        	}
        }
        
        void EliCOLCheckedChanged(object sender, EventArgs e)
        {
        	for(int i=0; i<this.tblProv.RowCount; i++){
        		this.tblProv[0, i].Value = this.eliCOL.Checked;
				//list[0, i].Value = ((CheckBox) list.Controls.Find("checkboxHeader", true)[0]).Checked;    		
        	}
        }
        
        void AgrProvBTNClick(object sender, EventArgs e)
        {
        	BLProducto blProd = new BLProducto();
        	try{
	        	BEProducto prod = blProd.getProductoByCod(this.codigoProducto)[0];
	        	GUIDatosProductoPedido vent = new GUIDatosProductoPedido(2, prod, "", 0, this.listaProveedor);
	        	vent.ShowDialog();
	        	BEProveedor prov = vent.getProveedor();
	        	if(prov!=null){
		        	float precio = vent.getPrecio();
		        	BLProveedor blProv = new BLProveedor();
		        	BEProductoProveedorCompras prodProv = new BEProductoProveedorCompras();
		        	prodProv.CodigoProducto = prod.Codigo;
		        	prodProv.CodigoProveedor = prov.IdProv;
		        	prodProv.Precio = precio;
		        	int resultado = blProv.addProvProductoFiorella(prodProv);
		        	if(resultado==2){
		        		Utils.MessageInformation("El proveedor ya está asociado al producto.");
		        	}
		        	else{
		        		Utils.MessageInformation("El proveedor fue asociado al producto correctamente.");
		        		cargaTablaProveedores(prod.Codigo);
		        	}
	        	}       
        	}
        	catch{
        		Utils.MessageInformation("El producto fue eliminado por otro proceso.");
        		cargaTablaProductos();
        	}
        }
        
        void ProdVBTNClick(object sender, EventArgs e)
        {
        	int cont = 0, index=0, contAux = 0;
        	
        	foreach(DataGridViewRow fila in this.prodTBL.Rows){
        		if(fila.Cells[0].Value != null && (bool)fila.Cells[0].Value){
        			index = contAux;
        			cont++;
        		}      		
        		contAux++;
        	} 
	        if(cont==0){
	        	Utils.MessageAviso("Debe seleccionar algún producto para mostrar su información.",null);
	        }
	        if(cont>1){
	        	Utils.MessageAviso("Debe seleccionar solo 1 producto para mostrar su información.",null);
	        }
	        if(cont==1){
	        	BLProducto bProd = new BLProducto();
			    List<BEProducto> prod = new List<BEProducto>();
			    int aux = Int32.Parse(this.prodTBL[1, index].Value.ToString());
			    try{
				    prod = bProd.getProductoByCod(aux);
				    // MessageBox.Show("" + prod.Codigo);
				    GUIModificarProducto modificarProd = new GUIModificarProducto(prod[0],2);
				    modificarProd.ShowDialog();
				    if (modificarProd.modProd==1) {
		            	cargaTablaProductos();            
				    }
			    }
			    catch{
			    	Utils.MessageInformation("El producto fue eliminado por otro proceso.");
			    	cargaTablaProductos();
			    }
	        }
        }
    }
}
